package org.xielei.designpatterns.behavioral.templatemethod;

/**
 * AbstractHookTemplateMethod
 * 抽象模版方法
 *
 * @author xielei
 * @date 2020/8/6
 */
public abstract class AbstractHookTemplateMethod {

    /**
     * 模板方法
     */
    void templateMethod() {
        abstractStartMethod();
        hookMethod();

        if (hookJudgeMethod()) {
            specificMethod();
        }

        abstractEndMethod();
    }

    /**
     * 具体方法
     */
    private void specificMethod() {
        System.out.println("抽象方法中的 具体方法被调用");
    }

    /**
     * 钩子方法，可被重写
     * @return
     */
    protected Boolean hookJudgeMethod() {
        return true;
    }

    /**
     * 钩子方法，可被重写
     */
    protected void hookMethod() {
    }

    /**
     * 抽象方法，由子类实现
     */
    protected abstract void abstractStartMethod();

    /**
     * 抽象方法，由子类实现
     */
    protected abstract void abstractEndMethod();
}
